3 dp[i][j] = Mínimo costo de partir la cadena entre las
4 particiones i e j, ambas incluídas.
11 while (scanf("%d %d", &n
, &m
)==2){
13 for (int i
=1; i
<=m
; ++i
){
19 for (int i
=0; i
<m
; ++i
){
23 for (int i
=m
-2; i
>=0; --i
){
24 for (int j
=i
+2; j
<m
; ++j
){
27 for (int k
=i
+1; k
<j
; ++k
){
28 t
= min(t
, dp
[i
][k
] + dp
[k
][j
]);
34 printf("%d\n", dp
[0][m
-1]);
43 dp[i][j] = Mínimo costo de partir la cadena entre las
44 particiones i e j, ambas incluídas. pivot[i][j] = Índice de
45 la partición que usé para lograr dp[i][j].
47 int dp
[1005][1005], pivot
[1005][1005];
52 while (scanf("%d %d", &n
, &m
)==2){
54 for (int i
=1; i
<=m
; ++i
){
60 for (int i
=0; i
<m
-1; ++i
){
63 for (int i
=0; i
<m
-2; ++i
){
64 dp
[i
][i
+2] = p
[i
+2] - p
[i
];
68 for (int d
=3; d
<m
; ++d
){ //d = longitud
69 for (int j
, i
=0; (j
= i
+ d
) < m
; ++i
){
70 dp
[i
][j
] = p
[j
] - p
[i
];
72 for (int k
=pivot
[i
][j
-1]; k
<=pivot
[i
+1][j
]; ++k
){
73 int x
= dp
[i
][k
] + dp
[k
][j
];
74 if (x
< t
) t
= x
, s
= k
;
76 dp
[i
][j
] += t
, pivot
[i
][j
] = s
;
80 printf("%d\n", dp
[0][m
-1]);